home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
WD_SRC.ZIP
/
SOURCE
/
LASTWOLF.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1995-01-30
|
10KB
|
449 lines
#include "..\Source\LastWolf.hpp"
int mike_new_handler( size_t t );
void OnExit();
extern Fixed topY, bottomY;
void main(int argc, char *argv[])
{
BspCommandLine commandLine;
WORD sizeSpeed = 4;
WORD moveSpeed = 15;
char screenMessage[256];
WORD frames=0;
BOOL bMessageOn=TRUE, bFrontAndBack = FALSE;
WORD allTextureLength = 64;
WORD i;
#ifdef DOS
// Stuff for the mouse.
WORD mouseX, mouseY;
WORD lastX=0, lastY=0;
BOOL bButton1, bButton2;
lastX = 320;
lastY = 200/2;
m_SetMousePos( 320, 200/2 );
#endif
_set_new_handler( mike_new_handler );
atexit( OnExit );
curLevel.pLines = new CLineArray;
curLevel.pPoints = new CPointArray;
player.xPos=0;
player.yPos=0;
player.facingAngle=0;
bBlackAndWhite=FALSE;
ProcessCommandLine( argc, argv, &commandLine );
curLevel.pRootLine = GenerateBspTree( &commandLine, curLevel.pLines, curLevel.pPoints );
if( curLevel.pRootLine == NULL )
{
printf("\a");
return;
}
s_Init();
s_MinX = 0;
s_MaxX = s_Width;
s_MinY = 0;
s_MaxY = s_Height;
s_DrawWidth = s_Width;
s_DrawHeight = s_Height;
dr_InitTables();
dr_GenerateLookups();
#ifdef DOS
#ifndef PALETTE_MAPS
if( commandLine.bLoadDoomTextures )
s_SetPalette( curLevel.palette );
#endif
#endif
t_StartTimer();
// Keep looping and drawing...
while(1)
{
if( kbhit() )
{
switch( toupper(getch()) )
{
case '?':
bFrontAndBack = !bFrontAndBack;
s_Clear(0);
s_Draw();
s_Clear(0);
s_Draw();
break;
case '/':
if( curLevel.idCurSky == curLevel.idSky1 )
curLevel.idCurSky = curLevel.idSky2;
else if( curLevel.idCurSky == curLevel.idSky2 )
curLevel.idCurSky = curLevel.idSky3;
else if( curLevel.idCurSky == curLevel.idSky3 )
curLevel.idCurSky = curLevel.idSky1;
break;
case '0':
ResetVideoMode(0);
dr_GenerateLookups();
break;
case '1':
ResetVideoMode(1);
dr_GenerateLookups();
break;
case '2':
ResetVideoMode(2);
dr_GenerateLookups();
break;
case '3':
ResetVideoMode(3);
dr_GenerateLookups();
break;
case '4':
ResetVideoMode(4);
dr_GenerateLookups();
break;
case 'T':
// Reset the fps calculations.
timeCount=0;
frames=0;
break;
case 'Z':
allTextureLength -= 3;
for( i=0; i < curLevel.pLines->NumElements(); i++ )
curLevel.pLines->GetLine(i)->SetTextureXLength(allTextureLength);
break;
case 'X':
allTextureLength += 3;
for( i=0; i < curLevel.pLines->NumElements(); i++ )
curLevel.pLines->GetLine(i)->SetTextureXLength(allTextureLength);
break;
case 'M':
bMessageOn = !bMessageOn;
break;
case '-':
if( s_MinX != (s_Width/2)-50 )
{
s_MinX += sizeSpeed;
s_MaxX -= sizeSpeed;
s_MinY += sizeSpeed;
s_MaxY -= sizeSpeed;
s_DrawWidth = s_MaxX - s_MinX;
s_DrawHeight = s_MaxY - s_MinY;
s_Clear(0);
s_Draw();
s_Clear(0);
s_Draw();
dr_GenerateLookups();
}
break;
case '+':
if( s_MaxX != s_Width )
{
s_MinX -= sizeSpeed;
s_MaxX += sizeSpeed;
s_MinY -= sizeSpeed;
s_MaxY += sizeSpeed;
s_DrawWidth = s_MaxX - s_MinX;
s_DrawHeight = s_MaxY - s_MinY;
s_Clear(0);
s_Draw();
s_Clear(0);
s_Draw();
dr_GenerateLookups();
}
break;
case 'V':
break;
case ';':
zFadeOut -= 10;
if( zFadeOut < 10 )
zFadeOut = 10;
break;
case ''':
zFadeOut += 10;
break;
case '[':
++parallaxMap;
if( parallaxMap == (nPaletteMaps-1) )
parallaxMap = 0;
break;
case ']':
--parallaxMap;
if( parallaxMap == 0 )
parallaxMap = nPaletteMaps-2;
break;
case 'U':
topY += FIXED_ONE;
bottomY += FIXED_ONE;
break;
case 'I':
topY -= FIXED_ONE;
bottomY -= FIXED_ONE;
break;
case 'H':
topY += FIXED_ONE;
break;
case 'J':
topY -= FIXED_ONE;
break;
case 'A':
player.xPos -= W_UNFIX(SAFE_SIN(player.facingAngle + HALF_PI) * moveSpeed);
player.yPos -= W_UNFIX(SAFE_COS(player.facingAngle + HALF_PI) * moveSpeed);
#ifndef DOS
printf("Moving left.\n");
#endif
break;
case 'S':
player.xPos -= W_UNFIX(SAFE_SIN(player.facingAngle) * moveSpeed);
player.yPos -= W_UNFIX(SAFE_COS(player.facingAngle) * moveSpeed);
#ifndef DOS
printf("Moving back.\n");
#endif
break;
case 'D':
player.xPos -= W_UNFIX(SAFE_SIN(player.facingAngle - HALF_PI) * moveSpeed);
player.yPos -= W_UNFIX(SAFE_COS(player.facingAngle - HALF_PI) * moveSpeed);
#ifndef DOS
printf("Moving right.\n");
#endif
break;
case 'W':
player.xPos += W_UNFIX(SAFE_SIN(player.facingAngle) * moveSpeed);
player.yPos += W_UNFIX(SAFE_COS(player.facingAngle) * moveSpeed);
#ifndef DOS
printf("Moving forward.\n");
#endif
break;
case 'R':
player.facingAngle = (player.facingAngle + 10) & ANGLE_MASK;
#ifndef DOS
printf("Rotating right.\n");
#endif
break;
case 'F':
player.facingAngle = (player.facingAngle - 10) & ANGLE_MASK;
#ifndef DOS
printf("Rotating left.\n");
#endif
break;
case '.':
++moveSpeed;
break;
case ',':
--moveSpeed;
break;
case 'P':
bDisplayProjectionPoints = !bDisplayProjectionPoints;
break;
case 'B':
bBlackAndWhite = !bBlackAndWhite;
#ifndef DOS
printf("Switching black&white toggle.\n");
#endif
break;
case 'Q':
goto QUIT;
break;
}
}
#ifdef DOS
m_GetMousePos( &mouseX, &mouseY, &bButton1, &bButton2 );
// Change their rotation based on X.
player.facingAngle = (player.facingAngle - (lastX - mouseX)) & ANGLE_MASK;
// Move them based on Y.
player.xPos += W_UNFIX(SAFE_SIN(player.facingAngle) * (lastY-mouseY) );
player.yPos += W_UNFIX(SAFE_COS(player.facingAngle) * (lastY-mouseY) );
lastX = mouseX;
lastY = mouseY;
// If button 1 is down, move them forward.
if( bButton1 )
{
player.xPos += W_UNFIX(SAFE_SIN(player.facingAngle) * moveSpeed);
player.yPos += W_UNFIX(SAFE_COS(player.facingAngle) * moveSpeed);
}
// Put the mouse in the center if it's off the screen.
if( mouseX >= (320*2-3) || mouseX == 0 || mouseY >= (200-3) || mouseY == 0 )
{
lastX = 320;
lastY = 200/2;
m_SetMousePos( 320, 200/2 );
}
#endif
if( bFrontAndBack )
{
// Front.
s_MinX = 0;
s_MaxX = s_Width;
s_MinY = 0;
s_MaxY = s_Height/2 - 1;
s_DrawWidth = s_MaxX - s_MinX;
s_DrawHeight = s_MaxY - s_MinY;
dr_DrawScreen();
s_DrawRegion( s_MinX, s_MinY, s_MaxX, s_MaxY, s_MinX, s_MinY );
// Back.
player.facingAngle = (player.facingAngle + PI) & ANGLE_MASK;
dr_DrawScreen();
s_DrawRegion( s_MinX, s_MinY, s_MaxX, s_MaxY, s_MinX, s_Height / 2 + 1 );
player.facingAngle = (player.facingAngle + PI) & ANGLE_MASK;
}
else
{
dr_DrawScreen();
// If the screen is small, draw a border.
if( s_DrawWidth != s_Width )
{
dr_DrawLine( s_MinX, s_MinY, s_MaxX, s_MinY, s_Width, s_Height, 30 );
dr_DrawLine( s_MinX, s_MinY, s_MinX, s_MaxY, s_Width, s_Height, 30 );
dr_DrawLine( s_MaxX, s_MinY, s_MaxX, s_MaxY, s_Width, s_Height, 30 );
dr_DrawLine( s_MinX, s_MaxY, s_MaxX, s_MaxY, s_Width, s_Height, 30 );
}
if( bMessageOn )
{
sprintf( screenMessage, "FPS: %d W: %d H: %d", (WORD)((float)frames / ((float)timeCount/ 182.0F)), s_MaxX-s_MinX, s_MaxY-s_MinY );
s_BlitString( s_MinX+5, s_MaxY-20, 35, screenMessage, TRUE );
sprintf( screenMessage, "X: %d Y: %d A: %d", player.xPos, player.yPos, player.facingAngle );
s_BlitString( s_MinX+5, s_MaxY-10, 35, screenMessage, TRUE );
}
}
if( s_MaxX == s_Width )
s_Draw();
else
s_DrawRegion( s_MinX-1, s_MinY-1, s_MaxX+1, s_MaxY+1, s_MinX, s_MinY );
++frames;
}
QUIT:;
t_EndTimer();
curLevel.pLines->UnAllocateElements();
curLevel.pPoints->UnAllocateElements();
delete curLevel.pLines;
delete curLevel.pPoints;
if( commandLine.bLoadDoomTextures )
tx_UnloadTextures();
s_Clear(0);
s_Draw();
s_UnInit(TRUE);
printf( "FPS = %f", (float)frames / ((float)timeCount/60));
printf("\n\n");
}
int mike_new_handler( size_t t )
{
char errorMessage[256];
s_UnInit(TRUE);
sprintf(errorMessage, "\n\nError allocating %d bytes!\n\n", t );
puts(errorMessage);
return 0;
}
void OnExit()
{
s_UnInit(FALSE);
}